'''使用turtle库绘制一个颜色图谱。'''
import turtle as t

#初始化
t.penup()
t.pensize(1)
x,y = -750,-128
t.goto(x,y)
t.seth(90)
t.Turtle().screen.delay(0)
t.pendown()

#定义一个将RGB转换函数
def RGB2rgb(tp1):
    R,G,B = tp1[0],tp1[1],tp1[2]
    r,g,b = R/256,G/256,B/256
    tp2 = (r,g,b)
    return(tp2)

#定义一个绘制白色收殓色块的函数
def paintblock1(ls1,ls2):
    #获取列表的颜色值
    r1,g1,b1 = ls1[0],ls1[1],ls1[2]
    r2,g2,b2 = (255-ls1[0])/256,(255-ls1[1])/256,\
               (255-ls1[2])/256  #计算列内递增步长
    r3,g3,b3 = ls2[0],ls2[1],ls2[2]
    now_color = (r1,g1,b1)
    t.color(RGB2rgb(now_color))
    i = 1
    for col in range(255):
        for row in range(256):    
            t.fd(1) #绘制当前颜色像素点
            r1,g1,b1 = r1+r2,g1+g2,b1+b2 #列内颜色递增
            now_color = (r1,g1,b1)  #列内颜色参数值直接赋给颜色元组，不影响ls1中的列间结果
            t.color(RGB2rgb(now_color))  #获得列内新颜色
        if i%5 == 0:
            print('正在绘制第{}列'.format(i))
        i += 1
        #移动到下一列
        #t.penup()  #及时拿走画笔
        t.seth(0)
        t.fd(1)
        t.seth(90)
        t.bk(256)
        #列间颜色递变
        r1,g1,b1 = ls1[0]+r3,ls1[1]+g3,ls1[2]+b3  #注意r1,g1,b1此时已经为白色，需要复位回到上一列的初始颜色
        now_color = (r1,g1,b1)
        t.pencolor(RGB2rgb(now_color))
        ls1 = [r1,g1,b1]  #得到列内初始颜色
        r2,g2,b2 = (255-ls1[0])/256,(255-ls1[1])/256,\
                     (255-ls1[2])/256  #计算列内递增步长

#定义一个绘制黑色收敛色块的函数
def paintblock2(ls1,ls2):
    #获取列表的颜色值
    r1,g1,b1 = ls1[0],ls1[1],ls1[2]
    r2,g2,b2 = ls1[0]/256,ls1[1]/256,ls1[2]/256  #计算列内递减步长
    r3,g3,b3 = ls2[0],ls2[1],ls2[2]
    now_color = (r1,g1,b1)
    t.color(RGB2rgb(now_color))
    i = 1
    for col in range(255):
        for row in range(256):    
            t.fd(1) #绘制当前颜色像素点
            r1,g1,b1 = r1-r2,g1-g2,b1-b2 #列内颜色递增
            now_color = (r1,g1,b1)  #列内颜色参数值直接赋给颜色元组，不影响ls1中的列间结果
            t.color(RGB2rgb(now_color))  #获得列内新颜色
        if i%5 == 0:
            print('正在绘制第{}列'.format(i))
        i += 1
        #移动到下一列
        #t.penup()  #及时拿走画笔
        t.seth(0)
        t.fd(1)
        t.seth(-90)
        t.bk(256)
        #列间颜色递变
        r1,g1,b1 = ls1[0]+r3,ls1[1]+g3,ls1[2]+b3  #注意r1,g1,b1此时已经为白色，需要复位回到上一列的初始颜色
        now_color = (r1,g1,b1)
        t.pencolor(RGB2rgb(now_color))
        ls1 = [r1,g1,b1]  #得到列内初始颜色
        r2,g2,b2 = ls1[0]/256,ls1[1]/256,ls1[2]/256  #计算列内递减步长


paintblock1([255,0,0],[0,1,0])
paintblock1([255,255,0],[-1,0,0])

paintblock1([0,255,0],[0,0,1])
paintblock1([0,255,255],[0,-1,0])

paintblock1([0,0,255],[1,0,0])
paintblock1([255,0,255],[0,0,-1])

#注意以下代码需要的内存较大，因此在32bit的Python中会报错
#回到起点，调转方向
'''t.penup()
x,y = -750,-128
t.goto(x,y)
t.seth(-90)
t.pendown()


paintblock2([255,0,0],[0,1,0])
paintblock2([255,255,0],[-1,0,0])

paintblock2([0,255,0],[0,0,1])
paintblock2([0,255,255],[0,-1,0])

paintblock2([0,0,255],[1,0,0])
paintblock2([255,0,255],[0,0,-1])'''
